package com.xhj.mybatis.annotations;

import java.lang.annotation.*;

/**
 * Select
 *
 * @author XJks
 * @description 该注解用于指定用于检索记录的 SQL 语句。
 *
 * <b>用法示例：</b>
 * <pre>
 * {@code
 *   public interface UserMapper {
 *     @Select("SELECT id, name FROM users WHERE id = #{id}")
 *     User selectById(int id);
 *   }
 * }
 * </pre>
 */
@Documented // 表示该注解会被包含在 Javadoc 中
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时依然可用
@Target(ElementType.METHOD) // 该注解只能用于方法上
@Repeatable(Select.List.class) // 允许在同一个方法上多次使用 @Select 注解
public @interface Select {

    /**
     * 返回用于检索记录的 SQL 语句。
     *
     * @return 用于检索记录的 SQL 语句数组
     */
    String[] value();

    /**
     * 指定该 SQL 语句对应的数据库 id（可选）。
     * 用于多数据库环境下区分不同数据库的 SQL。
     *
     * @return 数据库 id
     */
    String databaseId() default "";

    /**
     * {@link Select} 注解的容器注解，用于支持重复注解，支持 @Repeatable 功能。
     */
    @Documented // 该内部注解也会被包含在 Javadoc 中
    @Retention(RetentionPolicy.RUNTIME) // 运行时依然可用
    @Target(ElementType.METHOD) // 只能用于方法上
    @interface List {
        /**
         * 存放多个 @Select 注解
         *
         * @return @Select 注解数组
         */
        Select[] value(); // 存放多个 @Select 注解
    }
}
